﻿// -------------------------------------------------------------------------
//    @FileName         :    NFBagPageOpDefine.h
//    @Author           :    gaoyi
//    @Date             :    2024/12/20
//    @Email            :    445267987@qq.com
//    @Module           :    NFBagPageOpDefine
//
// -------------------------------------------------------------------------

// --- 文件总结 ---------------------------------------------------------------
// 本文件定义背包页签操作所用到的通用数据结构与常量，包括：
// - 背包格子操作类型 EN_BAG_GRID_OP_TYPE（用于提交时标记格子变化）
// - 待增删物品数据（WillAddItemData/WillDelItemData 等）
// - 物品筛选与收集参数（SelectItemGridParam/GetOpItemParam/ItemOpData）
// - 常量 BAG_PAGE_CAPACITY_MAX
// 这些类型被 `NFBagPageOp` 与 `NFBagPageOpMgrInterface` 广泛使用。
// ---------------------------------------------------------------------------

#pragma once

#include <NFLogicCommon/NFItemDefine.h>
#include "NFComm/NFCore/NFPlatform.h"

class NFBagPageOp;

/** @brief 物品容器最大容量 */
const int BAG_PAGE_CAPACITY_MAX = 200;

/** 
 * @brief 背包格子变更类型（用于提交阶段判定增删改）
 */
enum EN_BAG_GRID_OP_TYPE
{
    /** @brief 未操作 */
    EN_BAG_GRID_OP_TYPE_NULL = 0,

    /** @brief 物品添加到空格子的操作 uuid(0->!0) */
    EN_BAG_GRID_OP_TYPE_ADD_TO_EMPTY_GRID,
    /** @brief 清空格子物品操作 uuid(!0->0) */
    EN_BAG_GRID_OP_TYPE_DEL_GRID,
    /** @brief uuid未变动，个数变动 */
    EN_BAG_GRID_OP_TYPE_NUM_CHANGE,
    /** @brief uuid未变动，个数未变动（可能属性变动了） */
    EN_BAG_GRID_OP_TYPE_NUM_NOT_CHANGE,
    /** @brief uuid变动（物品直接替换了，oldUUID消失，newUUID出现） */
    EN_BAG_GRID_OP_TYPE_ITEM_CHANGE,

    EN_BAG_GRID_OP_TYPE_COUNT,
};

/** 
 * @brief 删除物品请求统计（单 ID）
 */
struct DelItemData
{
    /** @brief 物品ID */
    int m_iWareID;
    /** @brief 想要删除的个数 */
    int m_iWantDelNum;
    /** @brief 实际删除的个数 */
    int m_iRealDelNum;

    DelItemData()
    {
        m_iWareID = 0;
        m_iWantDelNum = 0;
        m_iRealDelNum = 0;
    }
};

/** 
 * @brief 将要添加的物品基础信息（无数量），用于 Add 流程
 */
struct WillAddItemData
{
    /** @brief 物品ID */
    uint32_t id;
    /** @brief 品质 */
    int32_t quality;
    /** @brief 交易冷却时间 */
    uint32_t trade_cooldown;
    /** @brief 有效时间 */
    uint32_t effective_time;
    /** @brief 是否角色绑定 */
    bool role_bind;

    WillAddItemData()
    {
        id = 0;
        quality = 0;
        trade_cooldown = 0;
        effective_time = 0;
        role_bind = false;
    }

    /**
     * @brief 从物品对象构造
     * @param stItem 物品对象
     */
    WillAddItemData(const NFGridItem& stItem)
    {
        id = stItem.m_stBase.id;
        quality = stItem.m_stBase.quality;
        trade_cooldown = stItem.m_stBase.trade_cooldown;
        effective_time = stItem.m_stBase.effective_time;
        role_bind = stItem.m_stBase.role_bind;
    }
};

/** 
 * @brief 将要添加的物品及数量组合体
 */
struct WillAddItemDataWithNum
{
    WillAddItemDataWithNum()
    {
        m_iNum = 0;
    }

    /** @brief 物品基础数据 */
    WillAddItemData m_stAddItem;
    /** @brief 数量 */
    int m_iNum;
};

/** 
 * @brief 将要删除的物品数据
 */
struct WillDelItemData
{
    /** @brief 物品ID */
    int m_iItemID;
    /** @brief 品质 */
    int m_iQuality;
    /** @brief 想要删除的个数 */
    int m_iWantDelNum;

    WillDelItemData()
    {
        m_iItemID = 0;
        m_iQuality = 0;
        m_iWantDelNum = 0;
    }
};

/**
 * @brief 物品筛选类型
 */
enum
{
    /** @brief 比较所有 */
    SELECT_ITEM_GRID_TYPE_ALL = 0,
    /** @brief 不考虑绑定 */
    SELECT_ITEM_GRID_TYPE_NOT_CONSIDER_BIND = 1,
};

/** 
 * @brief 物品筛选参数（用于在一个页签内筛选格子）
 */
struct SelectItemGridParam
{
    /** @brief 物品基础数据 */
    GridItemBase base;
    /** @brief 筛选类型 */
    int selectType;
    
    SelectItemGridParam()
    {
        selectType = SELECT_ITEM_GRID_TYPE_ALL;
     }
     
    /**
     * @brief 获取调试信息
     * @return 调试信息字符串
     */
    std::string GetDebugInfo() const
    {
        return base.ShortDebugString() + " selectTye:{}" + NFCommon::tostr(selectType);
    }
};

/** 
 * @brief 收集可操作物品的过滤参数
 */
struct GetOpItemParam
{
    /** @brief 拥有者角色ID（=0 不校验拥有者） */
    uint64_t ullOwnerRoleID;
    /** @brief 过期时间戳（此时刻之前过期的不选，=0 不检测过期时刻） */
    uint32_t dwExpireUnixSec;
    /** @brief 是否获取绑定的物品格子（enGetOpWareParamBindType） */
    int iBindType;
    
    GetOpItemParam()
    {
        ullOwnerRoleID = 0;
        dwExpireUnixSec = 0;
        iBindType = EN_BT_AUTO;
    }
};

/** 
 * @brief 收集的物品操作信息，都必须合法有效（排序删除用）
 * @note 操作中的临时对象，不放入共享内存
 */
struct ItemOpData
{
    /** @brief 背包页签操作器 */
    NFBagPageOp* pBagPageOp;
    /** @brief 格子索引 */
    int iGridIndex;
    /** @brief 物品指针 */
    const NFGridItem* pItem;

    ItemOpData()
    {
        pBagPageOp = nullptr;
        iGridIndex = -1;
        pItem = nullptr;
    }
};

/** 
 * @brief 物品操作数据排序规则函数类型
 */
typedef bool (*NFItemOpDataCompareFun)(const ItemOpData& left, const ItemOpData & right);